package com.wtb.javatool.service.impl;

import com.fy.wetoband.http.utils.RequestUtil;
import com.wtb.javatool.common.R;
import com.wtb.javatool.dao.AssignmentMapper;
import com.wtb.javatool.dao.SubmissionMapper;
import com.wtb.javatool.dao.TaskMapper;
import com.wtb.javatool.dto.AssignmentDto;
import com.wtb.javatool.dto.SubmissionDto;
import com.wtb.javatool.dto.TaskDto;
import com.wtb.javatool.entity.Attachment;
import com.wtb.javatool.entity.Project;
import com.wtb.javatool.entity.Task;
import com.wtb.javatool.service.TaskService;
import com.wtb.javatool.vo.CourseTaskListCard;
import com.wtb.javatool.vo.TaskStatusMessage;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.Date;
import java.util.List;

@Service
public class TaskServiceImpl implements TaskService {
    private final TaskMapper taskMapper;
    private final AssignmentMapper assignmentMapper;
    private final SubmissionMapper submissionMapper;

    public TaskServiceImpl(TaskMapper taskMapper, AssignmentMapper assignmentMapper, SubmissionMapper submissionMapper) {

        this.taskMapper = taskMapper;
        this.assignmentMapper = assignmentMapper;
        this.submissionMapper = submissionMapper;
    }


    /**
     * 添加单个任务。
     *
     * @param task 要添加的任务实体(项目ID projectId）
     *             任务名称（taskName）
     *             任务创建时间（createTime）
     *             任务类型（taskType）
     *             创建人ID（creatorId）)
     * @return taskId 任务ID
     */
    public Long createTask(Task task) {
        return taskMapper.createTask(task);
    }


    /**
     * 根据项目ID、任务名称（可选）、任务类型（可选）、所属课程ID（可选）查询项目所有相关任务
     *
     * @param projectId 项目ID
     * @param taskName  任务名称，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param taskType  任务类型，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param courseId  所属课程ID，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param current   分页参数，表示查询结果的起始位置（从1开始）。
     * @param size      分页参数，表示每页返回的结果数量。
     * @return 任务列表
     */
    @Override
    public List<TaskDto> findTasksByProjectId(Long projectId, String taskName, Integer taskType, Long courseId, Long creatorId, Integer current, Integer size) {

        return taskMapper.findTasksByProjectId(projectId, taskName, taskType, courseId, creatorId, (current - 1) * size, size);
    }

    /**
     * 根据项目ID计算满足条件的项目ID数量。
     *
     * @param projectId 项目ID
     * @return 返回一个整数，表示满足条件的项目ID的数量。
     */
    @Override
    public int countTasksByProjectId(Long projectId, String taskName, Integer taskType, Long courseId, Long creatorId) {
        return taskMapper.countTasksByProjectId(projectId, taskName, taskType, courseId, creatorId);
    }

    @Override
    public List<TaskDto> findMyTasksByProjectIdAndUserId(Long projectId, String taskName, Integer taskType, Long courseId, Long userId, Integer begin, Integer size) {
        List<Long> list = taskMapper.findMyTasksIdByProjectIdAndUserId(projectId, taskName, taskType, courseId, userId, (begin - 1) * size, size);
        if (list.isEmpty()) return Collections.emptyList();
        return taskMapper.findMyTasksByTaskIds(list);
    }

    @Override
    public int countMyTasksByProjectIdAndUserId(Long projectId, String taskName, Integer taskType, Long courseId, Long userId) {
        return taskMapper.countMyTasksIdByProjectIdAndUserId(projectId, taskName, taskType, courseId, userId);
    }

    /**
     * 根据项目ID,返回该项目下所有任务的分配记录的状态数量。
     *
     * @param projectId 项目ID
     * @return 返回记录状态数量的列表，依次为分配总数、已完成、进行中、未开始、延期、未批阅。
     */
    public AssignmentDto findTaskAssignmentNumber(Long projectId,Integer evaluationType) {

        List<Long> taskIds = taskMapper.findTasksIdByProjectId(projectId);
        if (taskIds.isEmpty()) {
            AssignmentDto assignmentDto = new AssignmentDto();
            assignmentDto.setCompleted(0);
            assignmentDto.setExtension(0);
            assignmentDto.setTotal(0);
            assignmentDto.setNotStarted(0);
            assignmentDto.setNotReviewed(0);
            assignmentDto.setInProgress(0);
            return assignmentDto;
        } else return assignmentMapper.findAssignmentNumberByTasksId(taskIds,evaluationType);
    }

    /**
     * 根据任务ID获取任务详情信息
     *
     * @param taskId      任务ID
     * @param projectType 项目类型
     * @return 返回一个携带任务基本信息的任务DTO实体类
     */
    public TaskDto findTaskByTaskId(Long taskId, Integer projectType) {
        if (projectType == 1) {
            return taskMapper.findNormalTaskByTaskId(taskId);
        } else {
            return taskMapper.findTeachingTaskByTaskId(taskId);
        }
    }

    /**
     * 跟新任务名称
     *
     * @param task 任务实体，携带新的任务名称
     */
    public void updateTaskName(Task task) {
        taskMapper.updateTaskName(task);
    }

    /**
     * 跟新任务描述
     *
     * @param task 任务实体，携带新的任务描述
     */
    public void updateTaskDescription(Task task) {
        taskMapper.updateTaskDescription(task);
    }

    /**
     * 跟新任务类型
     *
     * @param task 任务实体，携带新的任务类型
     */
    public void updateTaskType(Task task) {
        taskMapper.updateTaskType(task);
    }

    /**
     * 跟新任务所属课程
     *
     * @param task 任务实体，携带新的所属课程
     */
    public void updateTaskCourse(Task task) {
        taskMapper.updateTaskCourse(task);
    }

    /**
     * 查询单个或多个任务下的所有提交内容和提交文件
     *
     * @param tasksId     任务id列表
     * @param projectType 项目类型，用于判断使用哪种查询
     * @return 提交记录列表，每条记录携带提交文件列表
     */
    public List<SubmissionDto> findSubmissionAndAchievementByTasksId(List<Long> tasksId, Integer projectType) {
        if (projectType == 1) {
            return null;
        } else {
            return submissionMapper.findTeachingSubmissionAndAchievementByTasksId(tasksId);
        }
    }
}
